package com.learning.spring.ioc.resource;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.FileCopyUtils;

import java.io.IOException;
import java.io.Reader;

/**
 * ClassName: ResourceLoad
 * Description: Spring 资源加载器：通过资源地址的特殊标识访问相应的资源
 * Date: 2018/7/26 14:09 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ResourceLoader {

    public static void main(String[] args) throws IOException {
        test();
    }

    /**
     * PathMatchingResourcePatternResolver:
     * 1. classpath: 类的根路径 使用。class
     * 2. file: 使用 UrlResource
     * 3. http:// 使用 UrlResource
     * 4. ftp:// 使用 UrlResource
     * 5. 没有前缀 根据具体的实现类型
     * <p>
     * 常用功能：
     * 加载 MyBatis 的 mapperLocations。()
     */
    static void test() throws IOException {


        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        // 默认使用 DefaultResourceLoader.getResource()
        // 1- "/" 开头，ClassPathContextResource
        // 2- "classpath:"开头，ResourceUtils.CLASSPATH_URL_PREFIX封装了常量，使用 ClassPathResource
        // 3- 其他使用 UrlResource
        // 4- 异常（如相对地址）：ClassPathContextResource
        Resource resource = resolver.getResource("classpath:spring-context.xml");

        EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
        Reader reader = encodedResource.getReader();

        String s = FileCopyUtils.copyToString(reader);
        System.out.println(s);


        // classpath*：不同jar包中，都有com.learning 包名，classpath加载第一个，classpath* 会加载多个
        // classpath*:/mapper/**/*Mapper.xml
        Resource[] resources = resolver.getResources("classpath*:spring-context.xml");

    }
}
